package com.pe.pgn.clubpgn.webapp.controller.flota;

import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbParametro; 
import com.pe.pgn.clubpgn.domain.ClpdFlota;
import com.pe.pgn.clubpgn.domain.ClprFlotaVehiculo;
import com.pe.pgn.clubpgn.domain.beans.BNClienteEmpresa;
import com.pe.pgn.clubpgn.domain.beans.BNFileUpload;
import com.pe.pgn.clubpgn.domain.beans.BNFlota;
import com.pe.pgn.clubpgn.domain.beans.BNGenerico;
import com.pe.pgn.clubpgn.service.ClienteEmpresaService;
import com.pe.pgn.clubpgn.service.FlotaService;
import com.pe.pgn.clubpgn.service.FlotaVehiculoService;
import com.pe.pgn.clubpgn.service.ParametroService;
import com.pe.pgn.clubpgn.service.SincronizacionFlotaService;
import com.pe.pgn.clubpgn.service.TarjetaEmpresaService;
import com.pe.pgn.clubpgn.util.PoiExcelReader2007;
import com.pe.pgn.clubpgn.util.PoiExcelWriter2007;
import com.pe.pgn.clubpgn.util.UploadFileUtil;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

@Controller
@RequestMapping("/flota/**")
@SuppressWarnings({"rawtypes","unchecked"})
public class FlotaController extends BaseFormController {
	
	protected final transient Log log = LogFactory.getLog(getClass());

	@Autowired
	private FlotaService flotaService;

	@Autowired
	private ClienteEmpresaService clienteEmpresaService;
	
	@Autowired
	private ParametroService parametroService;
	
	@Autowired
	private TarjetaEmpresaService tarjetaEmpresaService;
	
	@Autowired
	private FlotaVehiculoService flotaVehiculoService ;
	
	@Autowired
	private SincronizacionFlotaService sincronizacionService;
	
	@RequestMapping("/flotalist.html")
    public @ModelAttribute("flota") BNFlota listarFlotas(
    		@ModelAttribute("flota") BNFlota flota, @RequestParam(value = "search", required = false) String search, 
    		Model model) {

		boolean esInicial = Boolean.TRUE;
		if(search != null && StringUtils.isNotBlank(search)){
			esInicial = Boolean.FALSE;
		}
		model = asignarVariablesListadoFlotas(flota, model, esInicial);
		return flota;
    }
	
	public Model asignarVariablesListadoFlotas(BNFlota flota, Model model, boolean esInicial){

		List<BNFlota> flotas = flotaService.obtenerFlotas(flota, esInicial);		
		model.addAttribute("flotas", flotas);				
		return model;
	}
	
	@RequestMapping(value = "/flotaform.html", method = RequestMethod.GET)
	public @ModelAttribute("flota") ClpdFlota verFlota(
				@RequestParam(value = "id", required = false) Long id, Model model) {

		ClpdFlota flota = new ClpdFlota();
		if (id != null){
			
			flota = flotaService.obtenerFlota(id);				
			String dePrefijo = flota.getDeFlotaArea().substring(0, flota.getDeFlotaArea().indexOf(CLPConstantes.CARACTER_GUION_NO_ESPACIOS));
			String deSufijo = flota.getDeFlotaArea().substring(flota.getDeFlotaArea().indexOf(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)+1,flota.getDeFlotaArea().length());
			flota.setDePrefijo(dePrefijo.trim());
			flota.setDeSufijo(deSufijo.trim());
			return flota;
		}

		flota.setStFlota(Boolean.TRUE);
		return flota;
	}
	
	@RequestMapping(value = "/flotaform.html", method = RequestMethod.POST)
	public String guardarFlota(@ModelAttribute("flota") ClpdFlota flota,
			BindingResult result, SessionStatus status, HttpServletRequest request) {

		try {
			
			if (result.hasErrors()) {
				return "/flota/flotaform";
			}
			
			flota.setDeFlotaArea(flota.getDePrefijo() + CLPConstantes.CARACTER_GUION_NO_ESPACIOS + flota.getDeSufijo());			
			Long validaFlota = flotaService.validaFlota(flota.getDeFlotaArea().trim(), flota.getId()); 
				
			if (validaFlota > 0){
				saveError(request, getText("flotaform.error.existe", request.getLocale()));
				return "/flota/flotaform";
			}
			
			if (flota.getId() != null){
				sincronizacionService.guardarSyncPorFlota(flota);
			}
			
	        flotaService.guardarFlota(flota);
	        
			saveMessage(request, getText("flotaform.added",request.getLocale()));
			return "redirect:flotaform.html?id=" + flota.getId();
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/flota/flotaform";
		}

	}		
	
	@RequestMapping(value = "/exportararchivoflota.html")
	public void exportarArchivoFlota(HttpServletRequest request, HttpServletResponse response){
		
		try {

			Workbook workbook = PoiExcelWriter2007.createWorkbook();

			// Creando un nuevo sheet (hoja)
			Sheet sheet = PoiExcelWriter2007.createSheet(workbook, "Flotas");
			
			/**
			 * Creando la cabecera del archivo: Placa Tarjeta Alias Observaciones
			 */
			
			//Creando la fuente de la cabecera
			Font fuenteCabecera = PoiExcelWriter2007.createFont(workbook, Font.BOLDWEIGHT_BOLD, HSSFColor.BLACK.index, 
					(short)12, HSSFFont.FONT_ARIAL , Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, (short)0, 
					Boolean.FALSE, (byte)0);
			
			//Creando el estilo para la cabecera
			CellStyle estiloCabecera = workbook.createCellStyle();
			estiloCabecera.setFont(fuenteCabecera);
		
			String [] titulos = new String[]{"Placa", "Tarjeta", "Alias", "Observaciones"};
			
			int numRow = 0;
			Row row = PoiExcelWriter2007.createRow(sheet, numRow++);
			int numCell = 0;
			for(String titulo : Arrays.asList(titulos)){
				
				PoiExcelWriter2007.createTextCell(row, estiloCabecera, numCell++, titulo);	
			}
			
			response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
			response.setHeader("Content-Disposition","attachment; filename=\""+ "plantillaFlotas.xlsx" + "\"");
			 
			OutputStream out = response.getOutputStream();			  		
			workbook.write(out);				  		
			out.close();
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	@RequestMapping(value = "/cargarplacasform.html", method = RequestMethod.GET)
	public @ModelAttribute("fileUpload") BNFileUpload verCargarPlacas(
			@RequestParam(value = "idCliente", required = false) Long idCliente ,
			@RequestParam(value = "idFlotaID", required = false) Long idFlotaID ,
			Model model) {
		
		BNClienteEmpresa bnclienteEmpresa = clienteEmpresaService.obtenerBNClienteEmpresaByID(idCliente);
		String deFlotaArea = flotaService.obtenerFlotaAreaByID(idFlotaID);
		
		BNFileUpload fileUpload = new BNFileUpload();
		fileUpload.setBncliente(bnclienteEmpresa);
		fileUpload.setDeFlotaArea(deFlotaArea);
		fileUpload.setCoFlota(idFlotaID);
		return fileUpload;
	}
	
	@RequestMapping(value = "/eliminarplacasform.html", method = RequestMethod.GET)
	public @ModelAttribute("fileUpload") BNFileUpload verEliminarPlacas(
			@RequestParam(value = "idCliente", required = false) Long idCliente ,
			@RequestParam(value = "idFlotaID", required = false) Long idFlotaID ,
			Model model) {
		
		BNClienteEmpresa bnclienteEmpresa = clienteEmpresaService.obtenerBNClienteEmpresaByID(idCliente);
		String deFlotaArea = flotaService.obtenerFlotaAreaByID(idFlotaID);
		
		BNFileUpload fileUpload = new BNFileUpload();
		fileUpload.setBncliente(bnclienteEmpresa);
		fileUpload.setDeFlotaArea(deFlotaArea);
		fileUpload.setCoFlota(idFlotaID);
		return fileUpload;
	}	
	
	
	@RequestMapping(value = "/cargarplacasform.html", method = RequestMethod.POST)
	public String cargarPlacas(@ModelAttribute("fileUpload") BNFileUpload fileUpload,
		BindingResult result, SessionStatus status, HttpServletRequest request, Model model) {
		
		Long clienteEmpresaID = Long.parseLong(request.getParameter("idID"));
		Long flotaID = Long.parseLong(request.getParameter("idFlotaID"));
		
		ClpdFlota bnflota = flotaService.obtenerFlota(flotaID);
		BNClienteEmpresa bnclienteEmpresa = clienteEmpresaService.
		obtenerBNClienteEmpresaByID(clienteEmpresaID);
		
		String deFlotaArea = bnflota.getDeFlotaArea();
		fileUpload.setBncliente(bnclienteEmpresa);
		fileUpload.setDeFlotaArea(deFlotaArea);
		fileUpload.setCoFlota(flotaID);
		
		model.addAttribute("fileUpload", fileUpload);
		
		try{
			if (fileUpload.getFile().length == 0) 
			{
				Object[] args = new Object[] { getText("uploadForm.file", request.getLocale()) };    		
				saveError(request, getText("errors.required", args, request.getLocale()));
			}

			ClpbParametro parametro = parametroService.obtenerParametro(CLPConstantes.UPLOAD_DIR);
			String pathFile = UploadFileUtil.uploadFile(request, parametro.getVaValor());
			List dataSheet  = PoiExcelReader2007.getDataSheetFromWorkbook(pathFile, CLPConstantes.NUMERO_COLUMNAS_ARCHIVO_FLOTAS, 0, true);
			
			if(dataSheet != null && !dataSheet.isEmpty()){
				
				List titulos = (List) dataSheet.get(0);
				if(titulos != null && !titulos.isEmpty()){
					
					if(!titulos.get(0).equals("Placa") || !titulos.get(1).equals("Tarjeta")
							|| !titulos.get(2).equals("Alias") || !titulos.get(3).equals("Observaciones")){
						
						saveError(request, getText("flotaform.error.cargaarchivo.archivo.formato", request.getLocale()));
						return "/flota/cargarplacasform";
					}
					dataSheet.remove(0);					
				}
				
				Map<String,Object> map = validarCargaArchivoFlotas(dataSheet,deFlotaArea,model,false);
				if(map.get("isok").equals(CLPConstantes.ST_FALSO)){
					
					model = (Model)map.get("model");
					saveError(request, getText("flotaform.error.cargaarchivo", request.getLocale()));
					return "/flota/cargarplacasform";
				
				} else {
					
					log.info("Iniciando la cargarPlacas sincronizacionService");
					sincronizacionService.guardarSyncPorFlotasVehiculos(dataSheet, clienteEmpresaID);
					
					log.info("Iniciando la cargarPlacas flotaVehiculoService");
					flotaVehiculoService.guardarFlotasVehiculos(flotaID, dataSheet);

					saveMessage(request, getText("flotaform.carga.added", request.getLocale()));
					return "/flota/cargarplacasform";
				}	
				
			}
			else{
				saveError(request, getText("flotaform.error.cargaarchivo.archivo.formato", request.getLocale()));
				return "/flota/cargarplacasform";
			}
				
		}catch (Exception e) {
			log.info("EXCEPCION DE LA CARGARPLACAS "+ e.getMessage());
			saveError(request, getText("errors.general", request.getLocale()));
			return "/flota/cargarplacasform";
		}		
	}
	

	
	@RequestMapping(value = "/eliminarplacasform.html", method = RequestMethod.POST)
	public String eliminarPlacas(@ModelAttribute("fileUpload") BNFileUpload fileUpload,
			BindingResult result, SessionStatus status, HttpServletRequest request, Model model) {
		
		Long clienteEmpresaID = Long.parseLong(request.getParameter("idID"));
		Long idFlotaID = Long.parseLong(request.getParameter("idFlotaID"));
		
		ClpdFlota bnflota = flotaService.obtenerFlota(idFlotaID);
		BNClienteEmpresa bnclienteEmpresa = clienteEmpresaService.obtenerBNClienteEmpresaByID(clienteEmpresaID);
		String deFlotaArea = bnflota.getDeFlotaArea();
		
		fileUpload.setBncliente(bnclienteEmpresa);
		fileUpload.setDeFlotaArea(deFlotaArea);
		fileUpload.setCoFlota(idFlotaID);
		model.addAttribute("fileUpload", fileUpload);
		
		try{
			if (fileUpload.getFile().length == 0) 
			{   			
				Object[] args = new Object[] { getText("uploadForm.file", request.getLocale()) };    		
				saveError(request, getText("errors.required", args, request.getLocale()));
				//devolver la misma vista de cargarplacasform pero con la lista de errores en la parte inferior	
			}			

			ClpbParametro parametro = parametroService.obtenerParametro(CLPConstantes.UPLOAD_DIR);
			String pathFile = UploadFileUtil.uploadFile(request, parametro.getVaValor());
			List dataSheet  = PoiExcelReader2007.getDataSheetFromWorkbook(pathFile, CLPConstantes.NUMERO_COLUMNAS_ARCHIVO_FLOTAS, 0, false);
			
			if(dataSheet != null && !dataSheet.isEmpty()){
				
				List titulos = (List) dataSheet.get(0);
				if(titulos != null && !titulos.isEmpty()){
					
					if(!titulos.get(0).equals("Placa") || !titulos.get(1).equals("Tarjeta")
							|| !titulos.get(2).equals("Alias") || !titulos.get(3).equals("Observaciones")){
						
						saveError(request, getText("flotaform.error.cargaarchivo.archivo.formato", request.getLocale()));
						return "/flota/cargarplacasform";
					}
					dataSheet.remove(0);					
				}
				
				Map<String,Object> map = validarCargaArchivoFlotas(dataSheet,deFlotaArea,model,true);			
				if(map.get("isok").equals(CLPConstantes.ST_FALSO)){
					
					model = (Model)map.get("model");
					return "/flota/eliminarplacasform";			
				
				} else {
					
					String placa = "";
					String tarjeta = "";			
					String observaciones = "";
					
					for (int indice = 0; indice < dataSheet.size(); indice++){
						
						List placaList = (List)dataSheet.get(indice);
						placa 	= placaList.get(0) == null ? "" : placaList.get(0).toString().trim(); 
						tarjeta = placaList.get(1) == null ? "" : placaList.get(1).toString().trim();
						observaciones = placaList.get(3) == null ? "" : placaList.get(3).toString().trim();
						
						if(NumberUtils.isNumber(tarjeta)){
							BigDecimal numero = new BigDecimal(tarjeta);
							numero = numero.setScale (0, BigDecimal.ROUND_HALF_UP);
							tarjeta = numero.toString();					
						}
						
						Long tarjetaEmpresaID = tarjetaEmpresaService.obtenerId(tarjeta);						
						sincronizacionService.inactivarSyncPorFlotaVehiculo(idFlotaID,placa,tarjetaEmpresaID,clienteEmpresaID);
						flotaVehiculoService.eliminarFlotaVehiculo(idFlotaID,placa,tarjetaEmpresaID,observaciones);
					}

					saveMessage(request, getText("flotaform.carga.delete", request.getLocale()));
					return "/flota/eliminarplacasform";
				}				
				
			}
			else{
				saveError(request, getText("flotaform.error.cargaarchivo.archivo.formato", request.getLocale()));
				return "/flota/cargarplacasform";
			}
			
		}catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/flota/eliminarplacasform";
		}		
	}	

	
	@RequestMapping(value = "/clienteforflota.html", method = RequestMethod.GET)
	public String  listarFlotas(
			Model model) {
			List<BNClienteEmpresa> clientes = clienteEmpresaService.obtenerClienteEmpresasConLineaCredito(Boolean.FALSE);
			model.addAttribute("clientes", clientes);
		return "/wizard/clienteflotawizzardform";
	}		
	
	@RequestMapping(value="/eliminarflota.html",method = RequestMethod.GET)
	public String inactivarFlota(@RequestParam(value = "id", required = true) Long id, 
			HttpServletRequest request) {
		try {
			
			ClpdFlota flota = new ClpdFlota();		
			flota = flotaService.obtenerFlotaByID(id);
			flota.setStFlota(false);
			
        	sincronizacionService.guardarSyncPorFlota(flota);			
			flotaService.eliminarFlota(id);
			
			saveMessage(request, getText("flotaform.deleted", request.getLocale()));			
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/flota/flotaform";
		}
		return "redirect:flotalist.html";
	}
	
	
	private Map<String,Object> validarCargaArchivoFlotas(List dataSheet, 
		String deFlotaArea, Model model, boolean isDelete) throws IOException {

		String alias = "";
		String placa = "";
		String tarjeta = "";			
		String cadenaPlacas    = "";
		String cadenaTarjetas  = "";
		String observaciones   = "";
		
		Map<String,Object> mapMessage = new HashMap<String,Object>();
		Map<String, Object> mapBaseTarjetas = new HashMap<String, Object>();
		Map<String, ClprFlotaVehiculo> mapBasePlacas  = new HashMap<String, ClprFlotaVehiculo>();		
		
		List listErrorPlacaBlanco 	= new ArrayList<BNGenerico>();
		List listErrorPlacaLongitud = new ArrayList<BNGenerico>();
		List listErrorPlacaUsada = new ArrayList<BNGenerico>();
		List listErrorPlacaInvalida = new ArrayList<BNGenerico>();
		List listErrorPlacaRepetida = new ArrayList<BNGenerico>();
		List listErrorTarjetaBlanca = new ArrayList<BNGenerico>();
		List listErrorTarjetaUsada  = new ArrayList<BNGenerico>();
		List listErrorTarjetaBloqueada = new ArrayList<BNGenerico>();
		List listErrorTarjetaNoHabilitada = new ArrayList<BNGenerico>();
		List listErrorTarjetaNoExiste = new ArrayList<BNGenerico>();
		List listErrorTarjetaLongitud = new ArrayList<BNGenerico>();
		List listErrorAliasBlanca = new ArrayList<BNGenerico>();
		List listErrorAliasNoCorresponde = new ArrayList<BNGenerico>();
		List listErrorObservacionBlanca = new ArrayList<BNGenerico>();
		List listErrorObservacionesLongitud = new ArrayList<BNGenerico>();						
		
		//////////////////////////////////////////
		
		for (int f = 0; f < dataSheet.size(); f++) {
		
			List placaList = (List)dataSheet.get(f);
			placa   = placaList.get(0) == null ? "" : placaList.get(0).toString().trim();
			tarjeta = placaList.get(1) == null ? "" : placaList.get(1).toString().trim();
			
			if(NumberUtils.isNumber(tarjeta)){
				BigDecimal numero = new BigDecimal(tarjeta);
				numero = numero.setScale (0, BigDecimal.ROUND_HALF_UP);
				tarjeta = numero.toString();					
			}
			
			if(!placa.equals("")){
				
				cadenaPlacas += "'" + placa + "',";
			}			
			
			if(!tarjeta.equals("")){
				
				cadenaTarjetas += "'" + tarjeta + "',";
			}
		}
		
		if (cadenaTarjetas.endsWith(CLPConstantes.CARACTER_COMA)) {
			cadenaTarjetas = cadenaTarjetas.substring(0, cadenaTarjetas.length()-1);
			mapBaseTarjetas = tarjetaEmpresaService.obtenerMapValidacionTarjeta(cadenaTarjetas);
		}
		
		if (cadenaPlacas.endsWith(CLPConstantes.CARACTER_COMA)) {
			cadenaPlacas = cadenaPlacas.substring(0, cadenaPlacas.length()-1);
			mapBasePlacas = flotaVehiculoService.obtenerMapFlotaVehiculosPlaca(cadenaPlacas);
		}
		
		///////////////////////////////////////////
		
		List listPlacas = new ArrayList();
		for (int f = 0; f < dataSheet.size(); f++){
			
			List placaList = (List)dataSheet.get(f);
			placa   = placaList.get(0) == null ? "" : placaList.get(0).toString().trim(); 
			tarjeta = placaList.get(1) == null ? "" : placaList.get(1).toString().trim();
			alias   = placaList.get(2) == null ? "" : placaList.get(2).toString().trim();
			observaciones = placaList.get(3) == null ? "" : placaList.get(3).toString().trim();
			
			if(NumberUtils.isNumber(tarjeta)){
				BigDecimal numero = new BigDecimal(tarjeta);
				numero = numero.setScale (0, BigDecimal.ROUND_HALF_UP);
				tarjeta = numero.toString();					
			}
			
			//////////////////////////////
			//////////////////////////////
			
			if(StringUtils.isBlank(placa)){ //validar placa obligatorio
				
				BNGenerico bnerrorPlaca = new BNGenerico();	
				bnerrorPlaca.setId(new Long(f + 2));
				bnerrorPlaca.setDeDescripcion(CLPConstantes.INIROW + (f + 2) + CLPConstantes.FINROW);
				listErrorPlacaBlanco.add(bnerrorPlaca);	
			
			}else if(placa.length() > CLPConstantes.LONGITUD_MAXIMA_PLACA){ //validar longitud de placa
					
				BNGenerico bnerrorPlaca = new BNGenerico();	
				bnerrorPlaca.setId(new Long(f + 2));
				bnerrorPlaca.setDeDescripcion(placa);
				listErrorPlacaLongitud.add(bnerrorPlaca);	
					
			}else if(!ValidationUtil.isAlphanumeric(placa)){ //validando que sea placa alfanumerico
				
				BNGenerico bnerrorPlaca = new BNGenerico();	
				bnerrorPlaca.setId(new Long(f + 2));
				bnerrorPlaca.setDeDescripcion(placa);
				listErrorPlacaInvalida.add(bnerrorPlaca);
				
			}else if(mapBasePlacas.get(placa.toLowerCase()) != null && !isDelete){ //validar placa usada
						
				ClprFlotaVehiculo flotaVehiculo = mapBasePlacas.get(placa.toLowerCase());
				BNGenerico bnerrorPlaca = new BNGenerico();	
				bnerrorPlaca.setId(new Long(f + 2));
				bnerrorPlaca.setDeDescripcion(placa.concat(CLPConstantes.EN_FLOTA).concat(flotaVehiculo.getDeFlota()));							
				listErrorPlacaUsada.add(bnerrorPlaca);
				
			}else if(listPlacas.contains(placa)){ //validar placas repetidas en excel
				
				BNGenerico bnerrorPlaca = new BNGenerico();	
				bnerrorPlaca.setId(new Long(f + 2));
				bnerrorPlaca.setDeDescripcion(placa);							
				listErrorPlacaRepetida.add(bnerrorPlaca);
				
			}else if(!listPlacas.contains(placa)){
				listPlacas.add(placa);
			}
			
			//////////////////////////////
			//////////////////////////////
			
			if(StringUtils.isBlank(tarjeta)){ //validar tarjeta obligatoria
				
				BNGenerico bnerrortarjeta = new BNGenerico();	
				bnerrortarjeta.setId(new Long(f + 2));
				bnerrortarjeta.setDeDescripcion(CLPConstantes.INIROW + (f + 2) + CLPConstantes.FINROW);
				listErrorTarjetaBlanca.add(bnerrortarjeta);
				
			}else if(tarjeta.length()!= CLPConstantes.LIMITE_CODIGO_TARJETA_EMPRESA){ //validar longitud de tarjeta
					
				BNGenerico bnerrorTarjeta = new BNGenerico();	
				bnerrorTarjeta.setId(new Long(f + 2));
				bnerrorTarjeta.setDeDescripcion(tarjeta);
				listErrorTarjetaLongitud.add(bnerrorTarjeta);
					
			}else if(mapBaseTarjetas.get(tarjeta) == null){ //validar que exista
					
				BNGenerico bnerrorTarjeta = new BNGenerico();
				bnerrorTarjeta.setId(new Long(f + 2));
				bnerrorTarjeta.setDeDescripcion(tarjeta);						
				listErrorTarjetaNoExiste.add(bnerrorTarjeta);
		        
			}else if(mapBaseTarjetas.get(tarjeta).equals(CLPConstantes.TARJETA_EMPRESA_BLOQUEADA)){ //validar que no este bloqueada
				
				BNGenerico bnerrorTarjeta = new BNGenerico();
				bnerrorTarjeta.setId(new Long(f + 2));
				bnerrorTarjeta.setDeDescripcion(tarjeta);						
				listErrorTarjetaBloqueada.add(bnerrorTarjeta);					
			
			}else if(mapBaseTarjetas.get(tarjeta).equals(CLPConstantes.TARJETA_EMPRESA_NO_EXISTE_O_NO_HABILITADA)){ //validar que este habilitado
				
				BNGenerico bnerrorTarjeta = new BNGenerico();
				bnerrorTarjeta.setId(new Long(f + 2));
				bnerrorTarjeta.setDeDescripcion(tarjeta);						
				listErrorTarjetaNoHabilitada.add(bnerrorTarjeta);					
			
			}else if(mapBaseTarjetas.get(tarjeta).equals(CLPConstantes.TARJETA_EMPRESA_USADA) && !isDelete){ //validar que no este siendo usada
				
				BNGenerico bnerrorTarjeta = new BNGenerico();
				bnerrorTarjeta.setId(new Long(f + 2));
				bnerrorTarjeta.setDeDescripcion(tarjeta);						
				listErrorTarjetaUsada.add(bnerrorTarjeta);					
			}
			
			//////////////////////////////
			//////////////////////////////
			
			if(isDelete){
				if (StringUtils.isBlank(observaciones)){ //validar observaciones obligatorias
					
					BNGenerico bnerrorobservacion = new BNGenerico();	
					bnerrorobservacion.setId(new Long(f + 2));
					bnerrorobservacion.setDeDescripcion(CLPConstantes.INIROW + (f + 1) + CLPConstantes.FINROW);
					listErrorObservacionBlanca.add(bnerrorobservacion);
				}
			}
			
			if (observaciones.length() > CLPConstantes.LONGITUD_MAXIMA_OBSERVACIONES){ //validar longitud observaciones
				BNGenerico bnerrorobservacion = new BNGenerico();	
				bnerrorobservacion.setId(new Long(f + 2));
				bnerrorobservacion.setDeDescripcion(observaciones);
				listErrorObservacionesLongitud.add(bnerrorobservacion);	
			}
			
			//////////////////////////////
			//////////////////////////////
			
			
			if (StringUtils.isBlank(alias)){ //validar alias obligatoria
				
				BNGenerico bnerroralias = new BNGenerico();	
				bnerroralias.setId(new Long(f + 2));
				bnerroralias.setDeDescripcion(CLPConstantes.INIROW + (f + 2) + CLPConstantes.FINROW);
				listErrorAliasBlanca.add(bnerroralias);
				
			} else if(!alias.equals(deFlotaArea)){ //Validar que el alias sea el mismo de la flota area
				
				BNGenerico bnerrorAlias = new BNGenerico();
				bnerrorAlias.setId(new Long(f + 2));
				bnerrorAlias.setDeDescripcion(alias);
				listErrorAliasNoCorresponde.add(bnerrorAlias);
			}
		}
		

		if ((0 != listErrorPlacaBlanco.size())  || (0 != listErrorPlacaLongitud.size()) || (0 != listErrorPlacaInvalida.size()) ||
			(0 != listErrorPlacaUsada.size())   || (0 != listErrorPlacaRepetida.size()) || (0 != listErrorTarjetaBlanca.size()) || (0 != listErrorTarjetaLongitud.size()) || 
			(0 != listErrorTarjetaUsada.size()) || (0 !=listErrorObservacionBlanca.size())   || (0 != listErrorObservacionesLongitud.size()) ||
			(0 != listErrorAliasBlanca.size())  || (0 != listErrorAliasNoCorresponde.size()) || (0 != listErrorTarjetaNoExiste.size()) || 
			(0 != listErrorTarjetaBloqueada.size()) || (0 != listErrorTarjetaNoHabilitada.size())){
			
			model.addAttribute("listErrorPlacaBlanco",listErrorPlacaBlanco);
			model.addAttribute("listErrorPlacaLongitud",listErrorPlacaLongitud);
			model.addAttribute("listErrorPlacaInvalida",listErrorPlacaInvalida);
		    model.addAttribute("listErrorPlacaUsada",listErrorPlacaUsada);
		    model.addAttribute("listErrorPlacaRepetida",listErrorPlacaRepetida);
		    model.addAttribute("listErrorTarjetaBlanca",listErrorTarjetaBlanca);
		    model.addAttribute("listErrorTarjetaLongitud",listErrorTarjetaLongitud);			        
		    model.addAttribute("listErrorTarjetaNoExiste",listErrorTarjetaNoExiste);
		    model.addAttribute("listErrorTarjetaBloqueada",listErrorTarjetaBloqueada);
		    model.addAttribute("listErrorTarjetaNoHabilitada",listErrorTarjetaNoHabilitada);			        			        
		    model.addAttribute("listErrorTarjetaUsada",listErrorTarjetaUsada);
		    model.addAttribute("listErrorObservacionBlanca",listErrorObservacionBlanca);
		    model.addAttribute("listErrorObservacionesLongitud",listErrorObservacionesLongitud);		        
		    model.addAttribute("listErrorAliasBlanca",listErrorAliasBlanca);
		    model.addAttribute("listErrorAliasNoCorresponde",listErrorAliasNoCorresponde);
		        
		    mapMessage.put("isok", CLPConstantes.ST_FALSO);
		    mapMessage.put("model", model);
			return mapMessage;	
		
		}else{
			
			mapMessage.put("isok", CLPConstantes.ST_VERDADERO);
			return mapMessage;
		}
	}
}